home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 2
/
Gold Medal Software Volume 2 (Gold Medal) (1994).iso
/
prog
/
adlip.arj
/
BKFORMAT.TXT
< prev
next >
Wrap
Text File
|
1989-01-25
|
6KB
|
152 lines
Ad Lib, January 1989
--------------------
The .INS instrument files have been grouped together to create a .BNK (bank)
file. The purpose of this is to save space. DOS will allocate 1K of space
for a file regardless of how small the file actually is. So the bank file
saves a significant amount of space.
We are currently modifying our software to use the .BNK file instead of
.INS files. The new software versions will all be numbered 1.5 and will
not support the old .INS files. However, a utility will be provided to
convert between the two formats. The default name for the bank file is
STANDARD.BNK although any name may be used as long as the file extension
is .BNK.
The .BNK file a basically a collection of the old .INS file structures (as
shown in Appendix C of the Programmer's Manual) with the waveform added to
the end.
Structure of .BNK files
-----------------------
FIELD# SIZE-bytes TYPE DESCRIPTION
HEADER
1 1 char file version, major
2 1 char file version, minor
3 6 char signature: "ADLIB-"
4 2 unsigned number of list entries used
5 2 unsigned total number of list entries in file
6 4 long absolute offset in file of start of name list
7 4 long absolute offset in file of start of data
8 8 char filler (set to zero)
INSTRUMENT NAME SECTION RECORD
1 2 unsigned index into data section
2 1 char flag: 0 if this record is not used, else 1
3 9 char instrument name (max 8 char + NULL)
DATA SECTION RECORD
1 1 char mode (0=melodic, 1=percussive)
2 1 char voice number (if percussive mode)
3 13 char modulator (operator 0) parameters
4 13 char carrier (operator 1) parameters
5 1 char wave form for modulator
6 1 char wave form for carrier
There is one header at the very beginning of the file. Field #6 in the
header is the absolute offset of the start of the instrument name section.
The instrument name section contains a list of records which contain the
instrument name, a flag and a pointer to the data section. Header field #5
gives the total number of records in this list, although not all of these
records may be in use. Header field #4 gives the number of name records which
are actually being used. The records in use will be placed at the beginning
of the section and will be arranged alphabetically by instrument name.
The data section contains the records of instrument parameters. One of these
records is equivalent to the .INS file structure, except that the 2-byte
fields are now 1-byte long. Two more bytes have been added for the wave
form type for each operator.
So, to read an instrument from the new bank file:
1. Read the header.
2. Use header field #6 to do a seek to the start of the instrument name
section.
3. Search the name section for the desired name. (The search is delimited
by header field #4.)
4. When found, get its index into the data section (name field #1).
5. Calculate the address where the data for this instument will be found:
header_field_#7 + (index * sizeof_data_record)
6. Do a seek to the calculated address and read the data.
Notes
-----
The instrument names are alphabetically arranged so that you are not limited
to using a linear search method. A binary search would be appropriate.
If you are going to be creating or deleting an instrument, you must preserve
the alphabetical order of instrument names. However, the data section is
not neccesarily ordered. When adding data, you can find the data record
to use from the index pointer from the first unused instrument name
record.
The unused instrument name records are not empty: the pointers into the data
section are valid and are used when adding instruments. When expanding the
instrument name section, field #1 must be initialized to a valid value.
(In this case, the data section must be shifted down and header field #7
must be adjusted accordingly.) The purpose of having empty name records is
to avoid having to rewrite the entire file every time an instrument is added.
C Structures
------------
The following are C structures which correspond to the information
given above.
/* Instrument bank file header */
typedef struct {
char majorVersion;
char minorVersion;
char sig [6]; /* signature: "ADLIB-" */
unsigned nrDefined; /* number of list entries used */
unsigned nrEntry; /* number of total entries in list */
long offsetIndex; /* offset in file of start of name list */
long offsetTimbre; /* offset in file of start of data */
char filler [8]; /* must be zero */
} BankHeader;
/* Name of instrument with a pointer to its position in the file */
typedef struct {
unsigned nrReference; /* index into data section */
char usedFlag; /* 0 if this entry is not used */
char TimbreName [9]; /* max 8 char's + NULL */
} BankEntry;
/* Operator structure */
typedef struct {
char ksl;
char freqMult;
char feedBack; /* used by operator 0 only */
char attack;
char sustLevel;
char sustain;
char decay;
char release;
char output;
char am;
char vib;
char ksr;
char fm; /* used by operator 0 only */
} Operator;
typedef struct {
char mode;
char percVoice;
Operator op0;
Operator op1;
char wave0; /* wave form for operator 0 */
char wave1; /* wave form for operator 1 */
} PackedTimbre;